package com.mjf.scala.chapter05

/**
 * 函数至简原则
 */
object Scala03_TestFun {

  def main(args: Array[String]): Unit = {

    // 正常函数
    def f0(name: String): String = {
      return name
    }

    println(f0("abc"))

    // （1）return可以省略，Scala会使用函数体的最后一行代码作为返回值
    def f1(name: String): String = {
      name
    }

    println(f1("abc"))

    // （2）如果函数体只有一行代码，可以省略花括号
    def f2(name: String): String = name

    println(f2("abc"))

    // （3）返回值类型如果能够推断出来，那么可以省略（:和返回值类型一起省略）
    def f3(name: String) = name

    println(f3("abc"))

    // （4）如果有return，则不能省略返回值类型，必须指定
/*    def f4(name: String) = return name

    println(f4("abc"))*/

    // （5）如果函数明确声明unit，那么即使函数体中使用return关键字也不起作用
    def f5(name: String): Unit = {
      return name
    }

    println(f5("abc"))

    // （6）Scala如果期望是无返回值类型，可以省略等号
    def f6(name: String){   // 这种写法称为过程
      name
    }

    println(f6("abc"))

    // （7）如果函数无参，但是声明了参数列表，那么调用时，小括号，可加可不加
    def f7(): Unit = {
      println("hello")
    }

    f7()
    f7

    // （8）如果函数没有参数列表，那么小括号可以省略，调用时小括号必须省略
    def f8: Unit = {
      println("hello")
    }

//    f8()    // 报错
    f8

    // （9）如果不关心名称，只关心逻辑处理，那么函数名（def）可以省略
    // 变量名 : (参数列表声明) => 返回值类型
    def f9(f: (String) => Unit): Unit = {
      f("f9")
    }

    f9(f10)

    def f10(name: String): Unit = {
      println(name)
    }

    // 匿名函数 通过Lambda表达式实现 (参数列表)->{函数体}
    f9((name: String)=>{println(name)})

    // 最简写法
    f9(println)



  }

}
